import java.util.Scanner;

public class Test1 {

    //计算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值 。
    public static double test1() {
        double sum = 0;
        int flg = 1;
        for (int i = 1; i <= 100; i++) {
            sum += 1.0 / i * flg;
            flg = -flg;
        }
        return sum;
    }

    //输出一个整数的每一位，如：123的每一位是3，2，1
    public static void test2(int n) {
        while (n != 0) {
            System.out.println(n % 10);
            n /= 10;
        }
    }

    //编写代码模拟三次密码输入的场景。 最多能输入三次密码，密码正确，提示“登录成功”,密码错误， 可以重新输 入，最多输入三次。三次均错，则提示退出程序
    public static void login() {
        Scanner in = new Scanner(System.in);
        for (int i = 2; i >= 0; i--) {
            System.out.print("请输入密码：");
            String passWord = in.nextLine();

            if (passWord.equals("123456")) {
                System.out.println("登录成功");
                break;
            } else {
                System.out.println("密码错误，你还有" + i + "次机会");
            }

            if (i == 0) {
                System.out.println("退出程序");
            }
        }
    }

    //输出n*n的乘法口诀表，n由用户输入。
    public static void test3(int n) {
        for (int i = 1; i <= 9; i++) {
            for (int j = 1; j <= i; j++) {
                System.out.print(i + " x " + j + " = " + i * j + "   ");
            }
            System.out.println();
        }
    }

    //创建方法求两个数的最大值max2，随后再写一个求3个数的最大值的函数max3。
    //要求：在max3这个函数中，调用max2函数，来实现3个数的最大值计算

    //方法重载
    public static int max(int a, int b) {
        return a > b ? a : b;
    }

    public static int max(int a, int b, int c) {
        int tmp = max(a, b);
        return tmp > c ? tmp : c;
    }

    //求斐波那契数列的第n项。(迭代实现)
    // 1 1 2 3 5 8 13 21 34 55
    public static int fib(int n) {
        if (n == 1 || n == 2) {
            return 1;
        }
        int f1 = 1;
        int f2 = 1;
        int f3 = 0;
        for (int i = 3; i <= n; i++) {
            f3 = f1 + f2;
            f1 = f2;
            f2 = f3;
        }
        return f3;
    }

    //求和的重载
    //在同一个类中,分别定义求两个整数的方法 和 三个小数之和的方法。 并执行代码，求出结果
    public static int sum(int a, int b) {
        return a + b;
    }

    public static double sum(double a, double b, double c) {
        return a + b + c;
    }


    //递归求n的阶乘
    public static int test5(int n) {
        if (n == 1) {
            return 1;
        } else {
            return n * test5(n - 1);
        }
    }

    public static void main(String[] args) {
        System.out.println(test5(5));
    }

    //按顺序打印一个数字的每一位（例如1234，打印出1 2 3 4）
    public static void test6(int n) {
        if (n <= 9) {
            System.out.print(n + " ");
        } else {
            test6(n / 10);
            System.out.print(n % 10 + " ");
        }
    }


    //递归求 1 + 2 + 3 + ... + 10
    public static int sum(int n) {
        if (n == 1) {
            return 1;
        }
        return n + sum(n - 1);
    }



    //写一个递归方法，输入一个非负整数，返回组成它的数字之和.
    //例如，输入 1729, 则应该返回1+7+2+9，它的和是19

    public static int test7(int n) {
        if (n <= 9) {
            return n;
        }
        return n % 10 + test7(n / 10);
    }


    //求斐波那契数列的第 N 项
    public static int fib2(int n) {
        if (n == 1 || n == 2) {
            return 1;
        }
        return fib2(n - 1) + fib2(n - 2);
    }



    //汉诺塔
    //2 ^ n - 1
    //1  A->C
    //2  A->B  A->C  B->C
    //3  A->C  A->B  C->B  A->C  B->A  B->C  A->C

    /**
     * @param n
     * @param pos1 起始位置
     * @param pos2 中转位置
     * @param pos3 目的位置
     */
    public static void hanNuoTa(int n, char pos1, char pos2, char pos3) {
        if (n == 1) {
            move(pos1, pos3);
        } else {
            //将n-1个盘子从pos1借助pos3移动到pos2上
            hanNuoTa(n - 1, pos1, pos3, pos2);
            //将pos1剩下的一个盘子移到pos3上
            move(pos1, pos3);
            //将n-1个盘子从pos2借助pos1移到到pos3上
            hanNuoTa(n - 1, pos2, pos1, pos3);
        }
    }

    public static void move(char pos1, char pos2) {
        System.out.print(pos1 + "->" + pos2 + "  ");
    }

}
